定期ミートアップ 第28回
Object#unsafe_cast を入れた
code:sk
b = None.unsafe_cast(Array<Maybe<Int>>) b.push(Some.new(123)) # ok
Function callとmethod callは違う
もっと単純なヒューリスティックを先に入れようかなあ
典型例
code:sk
1,2,3.each do |i| # iの型を推論したい p i
end
Array<Int>#eachの引数の型はFn1<Int, Void>なので、ブロックパラメータの型はわかるはず
code:sk
1,2,3.map<String>{|i: Int| i.to_s} 1,2,3.map{|i| i.to_s} # こう書きたい mapのシグネチャは Array<T>#map<U>(f: Fn1<T, U>) -> U
Array<Int>の場合、map<U>(f: Fn1<Int, U>)
ブロックの型は、ブロックパラメータの型がわかれば最後の式の型でわかる(Fn1<Int, String>)
Array and MutableArray(or ArrayBuffer)
Arrayクラスをimmutableにしたい
code:sk
enum Type
case Raw(name: String, tyargs: Array<Type>)
case Variable(name: String)
case Existential(name: String)
case Quantification(name: String, type: Type)
case Function(arg_tys: Array<Type>, ret_ty: Type)
...
end
エラーになる
Array<Type::Variable> は Array<Type> として使えない
Arrayがimmutable(read-only)であれば、これを許しても大丈夫